Day 8 已經介紹過 Docker Volume,今天要正式把它用在 PostgreSQL 上。
如果資料只存在 Container 的可寫層中,當 Container 被刪除時,裡面的資料也會跟著消失。
但資料庫通常會保存帳號、員工、訂單等重要資料,因此不能因為重新建立 Container 就全部不見。
這時就可以利用 Volume 將資料獨立保存。
PostgreSQL Container
│
↓
Docker Volume
│
↓
資料持續保存
首先建立一個新的 Volume:
docker volume create postgres-data
接著查看目前的 Volume:
docker volume ls
如果看到:
postgres-data
就代表建立成功。
接著建立 PostgreSQL Container,並加入 Volume:
docker run --name my-postgres -e POSTGRES_PASSWORD=123456 -p 5432:5432 -v postgres-data:/var/lib/postgresql/data -d postgres
其中最重要的是:
-v postgres-data:/var/lib/postgresql/data
可以拆成:
postgres-data
↓
Docker Volume
/var/lib/postgresql/data
↓
PostgreSQL Container 的資料目錄
PostgreSQL 產生的資料就會保存到 Volume 中。
可以使用:
docker inspect my-postgres
查看 Container 的詳細資訊。
在 Mounts 中可以找到類似:
Source:postgres-data
Destination:/var/lib/postgresql/data
代表 Volume 已經成功掛載到 PostgreSQL。
這也是今天最重要的實驗。
先停止並刪除 Container:
docker stop my-postgres
docker rm my-postgres
再查看 Volume:
docker volume ls
會發現:
postgres-data
依然存在。
這代表:
刪除 Container
≠
刪除 Volume
之後只要建立新的 PostgreSQL Container,並重新掛載同一個 Volume,就可以繼續使用原本保存的資料。
可以把今天的概念整理成:
Container
│
│ 可以刪除
↓
PostgreSQL
│
↓
Volume
│
│ 獨立保存
↓
資料仍然存在
這也是為什麼在使用 Docker 執行資料庫時,Volume 是非常重要的一部分。
-v 保存資料postgres-data Volumedocker volume ls 查看 Volumedocker inspect 查看掛載資訊今天把之前學過的 Volume 真正應用到 PostgreSQL 上,也更能理解為什麼資料庫需要做資料持久化。
如果只是練習 Container,刪掉重新建立可能沒有太大影響,但資料庫裡通常會保存重要資料,如果資料跟著 Container 一起消失就會很麻煩。
透過 Volume,可以讓 PostgreSQL 的資料和 Container 分開保存。即使之後重新建立 Container,只要掛載原本的 Volume,就可以繼續使用資料。學到這裡,Docker 的 Container、Port、Volume 和 PostgreSQL 也開始真正串在一起了。